/*	Nama file		: Date.h
	Deskripsi		: Deklarasi type dan prototype primitif type date
	Nama pembuat	: Muhammad Ghufron Mahfudhi (23512066), Ni Made Satvika Iswari(23512077)
	Hari / Tanggal	: Sabtu, 22 September 2012
*/

#ifndef Date_H
#define Date_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_CHAR 100

typedef struct
{
	int DD;
	int MM;
	int YY;
} Date;

/* definisi prototype primitif type tanggal */
/* Definisi dan spesifikasi selektor */
/* Selektor Get */
#define GetDay(D) (D).DD
/*	Memberikan hari DD dari D yang terdiri dari <DD, MM, YY> */
#define GetMonth(D) (D).MM
/*	Memberikan bulan MM dari D yang terdiri dari <DD, MM, YY> */
#define GetYear(D) (D).YY
/*	Memberikan tahun YY dari D yang terdiri dari <DD, MM, YY> */
/* Selektor Set */
#define SetDay(D, newDay) (*D).DD = newDay
/*	Mengubah nilai komponen DD dari D */
#define SetMonth(D, newMonth) (*D).MM = newMonth
/*	Mengubah nilai komponen MM dari D */
#define SetYear(D, newMonth) (*D).YY = newMonth
/*	Mengubah nilai komponen YY dari D */

/* Validasi Terhadap Type */
int IsDateValid (int D, int M, int Y);
/*	Mengirim 1 jika D, M, Y dapat membentuk tanggal yang valid */
/*	dipakai untuk mengetes sebelum membentuk sebuah tanggal */

/* Konstruktor */
Date MakeDate (int d, int m, int y);
/*	Membentuk tanggal dari tanggal d, bulan m, dan tahun y */
/*	Prekondisi : d, m, y dapat membentuk tanggal yang valid */
Date MakeDatefromStr(char date[], char month[], char year[]);
/* 	Membentuk tanggal dari string date, month, year */

/* Operator Baca/Tulis */
void BacaTanggal (Date *D);
/*	I.S. Sembarang */
/*	F.S. T terdefinisi dan merupakan tanggal yang valid */
/*	Proses : Mengulangi membaca komponen DD, MM, YY sehingga membentuk T yang valid */
void TulisTanggal (Date D);
/*	I.S. T terdefinisi */
/*	F.S. NIlai T ditulis ke layar dengan format DD/MM/YY */
/*	Proses : Menulis nilai setiap komponen T ke layar */
	
/* Predikat */
int IsEqD (Date D1, Date D2);
/*	Menghasilkan 1 jika D1 = D2 */
int IsBefore (Date D1, Date D2);
/*	Menghasilkan 1 jika D1 adalah tanggal sebelum D2 */
int IsAfter (Date D1, Date D2);
/*	Menghasilkan 1 jika D1 adalah tanggal sesudah D2 */
int IsKabisat (int Y);
/*	Menghasilkan 1 jika tahun Y adalah tahun kabisat yaitu habis dibagi 4 tetapi tidak habis dibagi 100, atau habis dibagi 400 */
char* DateToString(Date D);
/* 	Mengembalikan Tanggal dalam format dd/mm/yyyy */

#endif
